/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package ade.prime.activity.adapter;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import ade.prime.activity.R;
import ade.prime.model.Schedule;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Défini la structure de la vue de la liste d'un emploi du temps.
 * Chaque ligne affiche l'icone de niveau de synchronisation de l'emploi du temps et son nom.
 * @author Seb
 */
public class ScheduleListAdapter extends BaseAdapter {

	public static final int[] ICON_ID = {
		R.drawable.status_other,
		R.drawable.status_not_updated,
		R.drawable.status_waiting_for_update,
		R.drawable.status_updating,
		R.drawable.status_updated
	} ;

	protected List<Schedule> schedules ;

	protected LayoutInflater inflater ;

	/**
	 * Initialise l'adaptateur de la liste d'emploi du temps.
	 * @param context 
	 */
	public ScheduleListAdapter(Context context) {
		super() ;
		this.schedules = new ArrayList<Schedule>() ;
		this.inflater = LayoutInflater.from(context) ;
	}

	/**
	 * Initialise l'adaptateur de la liste d'emploi du temps.
	 * @param context
	 * @param scheduleNames 
	 */
	public ScheduleListAdapter(Context context, List<Schedule> schedules) {
		this(context) ;
		this.setSchedules(schedules) ;
	}
	
	/**
	 * Ajoute un emploi du temps.
	 */
	public void addSchedule(Schedule newSchedule) {
		if (!this.schedules.contains(newSchedule)) {
			this.schedules.add(newSchedule) ;
		}// if
		this.notifyDataSetChanged() ;
	}// addSchedule(Schedule)
	
	/**
	 * Supprime un emploi du temps.
	 */
	public void removeSchedule(Schedule removedSchedule) {
		this.schedules.remove(removedSchedule) ;
		this.notifyDataSetChanged() ;
	}// removeSchedule(Schedule)
	
	/**
	 * Met à jour un emploi du temps.
	 */
	public void updateSchedule(Schedule updatedSchedule) {
		Iterator<Schedule> iter = this.schedules.iterator() ;
		if (iter.hasNext()) {
			Schedule schedule = iter.next() ;
			int updatedId = updatedSchedule.getId() ;
//			Log.d("ScheduleListAdapter", String.format("Comparing: %d =?= %d : %b", //$NON-NLS-1$ //$NON-NLS-2$
//					schedule.getId(), updatedId, schedule.getId() == updatedId)) ;
			while (schedule.getId() != updatedId) {
				if (iter.hasNext()) {
					schedule = iter.next() ;
				} else {
					break ;
				}// if
			}// while
			if (schedule.getId() == updatedId) {
//				Log.d("ScheduleListAdapter", "Found match " + schedule) ; //$NON-NLS-1$ //$NON-NLS-2$
				schedule.setName(updatedSchedule.getName()) ;
				schedule.setResources(updatedSchedule.getResources()) ;
				schedule.setPeriod(updatedSchedule.getPeriod()) ;
				schedule.setProject(updatedSchedule.getProject()) ;
				schedule.setLastUpdate(updatedSchedule.getLastUpdate()) ;
			}// if
			this.notifyDataSetChanged() ;
		}// if
	}// updateSchedule(Schedule)
	
	/**
	 * Met à jour l'état d'un emploi du temps.
	 */
	public void updateScheduleState(Schedule updatedSchedule) {
		Iterator<Schedule> iter = this.schedules.iterator() ;
		if (iter.hasNext()) {
			Schedule schedule = iter.next() ;
			int updatedId = updatedSchedule.getId() ;
//			Log.d("ScheduleListAdapter", String.format("Comparing: %d =?= %d : %b", //$NON-NLS-1$ //$NON-NLS-2$
//					schedule.getId(), updatedId, schedule.getId() == updatedId)) ;
			while (schedule.getId() != updatedId) {
				if (iter.hasNext()) {
					schedule = iter.next() ;
				} else {
					break ;
				}// if
			}// while
			if (schedule.getId() == updatedId) {
//				Log.d("ScheduleListAdapter", "Found match " + schedule) ; //$NON-NLS-1$ //$NON-NLS-2$
				schedule.setState(updatedSchedule.getState()) ;
			}// if
			this.notifyDataSetChanged() ;
		}// if
	}// updateSchedule(Schedule)
	
	/**
	 * Remplace la liste des emplois du temps par la liste fournie et prévient
	 * la liste (vue) du changement de contenu.
	 * 
	 * @param scheduleNames nouvelle liste des noms des d'emplois du temps
	 */
	public void setSchedules(List<Schedule> schedules) {
		this.schedules.clear() ;
		this.schedules.addAll(schedules) ;
		this.notifyDataSetChanged() ;
	}// setSchedules(String[])

	/**
	 * Cette méthode permet de connaitre le nombre d'items présent dans la liste.
	 * @return nombre d'items présent dans la liste
	 */
	@Override
	public int getCount() {
		return this.schedules.size() ;
	}

	/**
	 * Permet de retourner un objet contenu dans la liste à l'indice passé 
	 * en paramètre.
	 * 
	 * @param position index dans la liste d'emploi du temps
	 * @return objet contenu dans la liste à l'indice index
	 */
	@Override
	public Schedule getItem(int position) {
		return this.schedules.get(position) ;
	}

	/**
	 * Retourne l'id d'un élément dans la liste à l'indice passé en paramètre.
	 * @param position index dans la liste d'emploi du temps
	 * @return id d'un élément dans la liste à l'indice index
	 */
	@Override
	public long getItemId(int position) {
		return position ;
	}

	/**
	 * Retourne la vue d'une ligne de la liste (Icone du niveau de synchronisation, nom de l'emploi du temps).
	 * @param position index dans la liste d'emploi du temps
	 * @param contentView vue
	 * @param parent Vue parente
	 * @return vue d'une ligne de la liste
	 */
	@Override
	public View getView(int position, View contentView, ViewGroup parent) {
		View v = contentView ;
		if (v == null) {
			v = this.inflater.inflate(R.layout.schedule_listitem, null) ;
		}// if

		Schedule schedule = this.getItem(position) ;
		TextView name = (TextView) v.findViewById(R.id.schedule_name) ;
		name.setText(schedule.getName()) ;
		ImageView icon = (ImageView) v.findViewById(R.id.schedule_status) ;
		//TODO Replace ICON_ID with enum ?
		icon.setImageResource(
				ScheduleListAdapter.ICON_ID[schedule.getState().ordinal()]) ;

		ImageView change = (ImageView) v.findViewById(R.id.changeSchedule) ;
		change.setVisibility(View.VISIBLE);

		return v ;
	}

}
